package com.vhans.bapi.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import com.vhans.bus.comm.model.dto.EmailDTO;
import com.vhans.bus.comm.model.dto.PasswdDTO;
import com.vhans.bus.user.domain.User;
import com.vhans.bus.user.domain.vo.UserInfoVO;
import com.vhans.bus.user.service.IUserService;
import com.vhans.core.web.controller.BaseController;
import com.vhans.core.web.model.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 用户控制器
 *
 * @author vhans
 **/
@Api(tags = "用户模块")
@RestController
@RequestMapping("/user")
public class UserController extends BaseController {

    @Autowired
    private IUserService userService;

    /**
     * 获取用户登录信息
     *
     * @return {@link UserInfoVO} 用户信息
     */
    @SaCheckLogin
    @ApiOperation(value = "获取用户登录信息")
    @GetMapping("/loginInfo")
    public Result<UserInfoVO> getLoginInfo() {
        return Result.success(userService.getLoginInfo());
    }

    /**
     * 获取用户基本信息
     *
     * @param userId 用户id
     * @return {@link User} 用户基本信息
     */
    @SaCheckLogin
    @ApiOperation(value = "获取用户基本信息")
    @GetMapping("/getInfo/{userId}")
    public Result<User> getInfo(@PathVariable Integer userId) {
        return Result.success(userService.getUserById(userId));
    }

    /**
     * 搜索平台用户列表
     *
     * @param name 用户昵称或用户名
     * @return {@link User} 用户列表
     */
    @SaCheckLogin
    @ApiOperation(value = "搜索平台用户列表")
    @GetMapping("/list/{name}")
    public Result<List<User>> searchUser(@PathVariable String name) {
        return Result.success(userService.searchUserList(name));
    }


    /**
     * 修改用户邮箱
     *
     * @param email 邮箱信息
     * @return 结果
     */
    @SaCheckLogin
    @ApiOperation(value = "修改用户邮箱")
    @PutMapping("/email")
    public Result<?> updateUserEmail(@Validated @RequestBody EmailDTO email) {
        userService.updateUserEmail(email);
        return Result.success();
    }

    /**
     * 修改用户头像
     *
     * @param file 文件
     * @return {@link Result<String>} 头像地址
     */
    @SaCheckLogin
    @ApiOperation(value = "修改用户头像")
    @PostMapping("/avatar")
    public Result<String> updateUserAvatar(@RequestParam(value = "file") MultipartFile file) {
        return Result.success(userService.updateUserAvatar(file));
    }

    /**
     * 修改我的密码
     *
     * @param password 密码
     * @return 结果
     */
    @SaCheckLogin
    @ApiOperation(value = "修改我的密码")
    @PutMapping("/password")
    public Result<?> updateAdminPassword(@Validated @RequestBody PasswdDTO password) {
        userService.updatePassword(password);
        return Result.success();
    }

    /**
     * 修改用户信息
     *
     * @param user 用户信息
     * @return 结果
     */
    @SaCheckLogin
    @ApiOperation(value = "修改用户信息")
    @PutMapping("/update")
    public Result<?> updateUserInfo(@Validated @RequestBody User user) {
        userService.updateUser(user);
        return Result.success();
    }
}